# 功能开发

## 一， 用户登录开发

- 在UserDao类中增加一个方法: login ， 如果登录成功：本方法要返回boolean；在登录的时候要用到用户名和密码，因此这个login方法要带两个形参

- 在login方法里写查询代码，按照用户名和密码查询

- 使用Junit4做单元测试

  ~~~java
  /**
       * 按照用户名和密码进行登录：
       * @param uName 用户名
       * @param upsw 密码
       * @return 登录成功：返回true， 否则返回false
       */
      public boolean login(String uName, String upsw){
          //登录成功与否的标志：true表示登录成功
          boolean flag = false;
  
          //1. 连接准备
          //conn: 表示数据库连接
          Connection conn = null;
          //pstmt：执行SQL语句
          PreparedStatement pstmt = null;
          //rs代表结果集，从数据库表里查到的结果放在rs中
          ResultSet rs = null;
  
          //2. 获取数据库连接: 从hikari连接池中获取：不是直接从数据库中打开连接：
          //用连接池能够提高数据库访问性能，特别是在大并发场景下
          conn = DbUtilHikari.getConnection();
  
          //3. 定义且准备SQL语句
          String sql = "SELECT * FROM user WHERE userName = ? AND userPswd = ?";
          try {
              pstmt = conn.prepareStatement(sql);
  
              //给？赋值
              pstmt.setString(1, uName);
              pstmt.setString(2, SecureUtil.md5(upsw));
  
              //下达执行指令：执行SQL语句: executeQuery:JDBC中执行查询的方法
              rs = pstmt.executeQuery();
  
              //判断rs结果集中有无数据：next():判断rs中有数据吗？有则返回true（即查到东西了）；
              if (rs.next()){
                  flag = true;
              }else{
                  flag = false;
              }
          } catch (SQLException e) {
              e.printStackTrace();
          } finally {
              //关闭数据库连接
              DbUtilHikari.close(rs, pstmt,conn);
          }
  
          return flag;
      }
  ~~~

---

## 二， 删除用户功能开发

- 在UserDao中增加一个方法：deletUser方法，删除用户是按照用户的编号来删除，一次只删除一个

- 如果删除成功返回1；否则返回其他

- 使用Junit4做单元测试

  ~~~java
  	/**
       * 按照用户标号删除用户
       * @param userId：用户编号
       * @return：如果删除成功返回1；否则返回0
       */
      public int deleteUser(int userId){
  
          int flag = 0;
          //变量声明
          Connection conn = null;
          PreparedStatement pstmt = null;
  
          //获取数据库连接
          conn = DbUtilHikari.getConnection();
  
          //定义并准备SQL语句
          String sql = "DELETE FROM user WHERE userID = ?";
          try {
             
              //执行SQL
              pstmt = conn.prepareStatement(sql);
  
              //给？赋值
              pstmt.setInt(1,userId);
  
              flag = pstmt.executeUpdate();
          } catch (SQLException e) {
              e.printStackTrace();
          } finally {
              DbUtilHikari.close(pstmt,conn);
          }
  
          return flag;
      }
  ~~~

---

## 三，修改用户功能开发

- 在UserDao中增加一个方法：updateUser, 参数有：用户编号，用户名，密码。

- 成功返回1：否则返回0；

  ~~~java
  /**
       * 修改用户信息
       * @param userID
       * @param userName
       * @param upsw
       * @return 成功返回1， 否则返回0
       */
      public int updateUser(int userID, String userName, String upsw){
          int flag = 0;
  
          //创建连接变量
          Connection conn = null;
          PreparedStatement pstmt = null;
  
          conn = DbUtilHikari.getConnection();
  
          String sql = "UPDATE user SET userName = ? , userPswd = ? WHERE userID = ?";
  
          try {
  
              pstmt = conn.prepareStatement(sql);
              pstmt.setString(1,userName);
              pstmt.setString(2,SecureUtil.md5(upsw));
              pstmt.setInt(3,userID);
  
              flag = pstmt.executeUpdate();
          } catch (SQLException e) {
              e.printStackTrace();
          } finally {
  
              DbUtilHikari.close(pstmt,conn);
          }
  
          return flag;
      }
  ~~~

---

## 四，查询所有用户

- 在UserDao中增加一个方法：selectAllUser，应为是无条件查询吗，所以不带形参；查询到的数据较多，所以返回值为List

- 封装一个User类，保存用户信息；

- 返回一个List<User>：查询到的所有用户集合

  ~~~java
  	/**
       * 查询所有的用户
       * @return：包含所有用户对象的集合
       */
      public List<User> selectAllUser(){
          //创建一个空集合，准备放用户对象
          List<User> userList = new ArrayList<>();
          //创建连接时需要用到的变量
          Connection conn = null;
          PreparedStatement pstmt = null;
          ResultSet rs = null;
  
          //打开连接
          conn = DbUtilHikari.getConnection();
  
          //准备SQL语句
          String sql = "SELECT userId, userName, userPswd FROM user";
  
          try {
  
              //执行SQL语句
              pstmt = conn.prepareStatement(sql);
              rs = pstmt.executeQuery();
  
              while (rs.next()){
                  //将rs中的数据转移到
                  User user = new User();
                  user.setUserId(rs.getInt("userId"));
                  user.setUserName(rs.getString("userName"));
                  user.setUserPswd(rs.getString("userPswd"));
                  userList.add(user);
              }
          } catch (SQLException e) {
              e.printStackTrace();
          } finally {
              DbUtilHikari.close(rs,pstmt,conn);
          }
          return userList;
      }
  ~~~

---

## 五，小结

1. 在更新数据库表（插入，修改和删除数据）是调用的方法为**pstmt.executeUpdate();**

2. 在查询过程中需要多一个变量**ResultSet rs = null;**同时执行的语句为**rs = pstmt.executeQuery();**

3. 执行SQL语句用到的代码为

   ~~~java
   			//执行SQL语句
               pstmt = conn.prepareStatement(sql);
               rs = pstmt.executeQuery();
   ~~~